package main

import "fmt"

//切片
//语法
//var identifier []type
//make函数创建切片
// var slice1 []type = make([]type, len)
// 也可以简写为
// slice1 := make([]type, len)

// func main() {
// 	var names []string //[]
// 	var numbers []int  //[]
// 	fmt.Printf("names: %v\n", names)
// 	fmt.Printf("numbers: %v\n", numbers)

// 	//长度len 容量cap
// 	var name = []string{"tim", "skye"} //2 2
// 	var number = []int{22, 20, 55} //3 3
// 	fmt.Printf("len(name): %v\n", len(name))
// 	fmt.Printf("cap(name): %v\n", cap(name))
// 	fmt.Printf("len(number): %v\n", len(number))
// 	fmt.Printf("cap(number): %v\n", cap(number))
// }

//切片的初始化
//切分
// func test1() {
// 	var s1 = []int{1, 2, 3, 4, 5, 6}
// 	s2 := s1[0:3]
// 	fmt.Printf("s2: %v\n", s2) //[1 2 3]
// 	s3 := s1[3:]
// 	fmt.Printf("s3: %v\n", s3) //[4 5 6]
// 	s4 := s1[2:5]
// 	fmt.Printf("s4: %v\n", s4) //[3 4 5]
// 	s5 := s1[:]
// 	fmt.Printf("s5: %v\n", s5) //[1 2 3 4 5 6]
// }
// func main() {
// 	//test1()
// 	//直接初始化
// 	s := []int{1, 2, 3}
// 	fmt.Printf("s: %v\n", s) //[1 2 3]

// 	//使用数组初始化
// 	arr := [...]int{1, 2, 3, 4, 5, 6}
// 	a := arr[:]
// 	fmt.Printf("a: %v\n", a) //a: [1 2 3 4]
// 	//使用数组的部分进行元素初始化（切片表达式）
// 	a1 := arr[2:5]
// 	fmt.Printf("a1: %v\n", a1) //a1: [3 4 5]
// 	a2 := arr[2:]
// 	fmt.Printf("a2: %v\n", a2) //a2: [3 4 5 6]
// 	a3 := arr[:3]
// 	fmt.Printf("a3: %v\n", a3) //a3: [1 2 3]

// 	//空切片（nil）
// 	var b []int
// 	fmt.Println(b == nil)
// 	fmt.Printf("len(b): %v\n", len(b)) //0
// 	fmt.Printf("cap(b): %v\n", cap(b)) //0
// }

//切片的遍历
// func main() {
// 	s := []int{1, 2, 3, 4, 5}
// 	//for
// 	for i := 0; i < len(s); i++ {
// 		fmt.Printf("s[%v]: %v\n", i, s[i])
// 	}
// 	//for range
// 	for i, v := range s {
// 		fmt.Printf("%v: %v\n", i, v)
// 	}
// }

//切片的增删查改
//增：append函数
// func main() {
// 	s := []int{}
// 	s = append(s, 1)
// 	s = append(s, 2)
// 	s = append(s, 1, 2, 3)   //添加多个元素
// 	fmt.Printf("s: %v\n", s) //s: [1 2 1 2 3]

// 	s1 := []int{1, 2, 3}
// 	s2 := []int{4, 5, 6}
// 	s1 = append(s1, s2...) //将一个切片添加给另一个切片 后面记得写...
// 	fmt.Printf("s1: %v\n", s1) //s1: [1 2 3 4 5 6]
// }

//删
// func main() {
// 	s := []int{1, 2, 3, 4, 5}
// 	//删除索引为2的元素
// 	s = append(s[0:2], s[3:]...) //s: [1 2 4 5]
// 	fmt.Printf("s: %v\n", s)
// 	// 公式：要从切片a中删除索引为index的元素，
// 	// 操作方法是a = append(a[:index], a[index+1:]...)
// }

//拷贝
func main() {
	s1 := []int{1, 2, 3}
	s2 := s1 //直接赋值 相当于传地址 改变元素会一起修改
	s2[0] = 100
	fmt.Printf("s1: %v\n", s1)
	fmt.Printf("s2: %v\n", s2)

	s3 := make([]int, 3)
	copy(s3, s1)
	s3[0] = 20                 //原数组不会被修改
	fmt.Printf("s1: %v\n", s1) //s1: [100 2 3]
	fmt.Printf("s3: %v\n", s3) //s3: [20 2 3]
}
